using System.Runtime.InteropServices;
#if MYCODE
using BepuUtilities.Vectors;
#else
using System.Numerics;
#endif
namespace BepuPhysics.Trees
{
    [StructLayout(LayoutKind.Explicit)]
    public struct NodeChild
    {
        [FieldOffset(0)]
        public Vector3 Min;
        [FieldOffset(12)]
        public int Index;
        [FieldOffset(16)]
        public Vector3 Max;
        [FieldOffset(28)]
        public int LeafCount;
    }

    // 请注意,此节点的格式意味着我们在正常执行期间不会显式测试根边界框。
    // 对于几乎所有宽泛的阶段用例,查询无论如何都会在根边界框内。对于非宽相位用途,可能会存储外部边界框
    // 在其他地方-例如,在广泛的阶段。

    /// <summary>
    /// 2-宽度的树节点。
    /// </summary>
    [StructLayout(LayoutKind.Explicit)]
    public unsafe struct Node
    {
        [FieldOffset(0)]
        public NodeChild A;
        [FieldOffset(32)]
        public NodeChild B;
    }

    // 在冲突测试期间不需要或不使用节点元数据,因此将其单独存储。
    // 这有助于避免跨缓存行拆分节点,并降低测试期间的内存带宽要求。
    /// <summary>
    /// 与2子树节点关联的元数据。
    /// </summary>
    [StructLayout(LayoutKind.Explicit)]
    public unsafe struct Metanode
    {
        [FieldOffset(0)]
        public int Parent;
        [FieldOffset(4)]
        public int IndexInParent;
        [FieldOffset(8)]
        public int RefineFlag;
        /// <summary>
        /// 自上一帧以来,在此节点开始的树的成本缓存更改。
        /// 本地成本变化与精炼旗帜结合在一起。它们从来不会同时使用。
        /// 这将在使用后立即被覆盖,因此不要期望这里会有任何超出优化调度范围的有意义的事情。
        /// </summary>
        [FieldOffset(8)]
        public float LocalCostChange;

    }
}
